/**
 * Alipay.com Inc.
 * Copyright (c) 2004-2022 All Rights Reserved.
 */
package com.example.spider.proxy.provider.coolproxy;

import com.example.spider.proxy.core.ProxyInfo;
import com.example.spider.proxy.core.tester.ProxyTypeEnum;
import com.example.spider.proxy.provider.AbstractProxyResultHandler;
import com.example.spider.proxy.provider.IpProxySpiderTask;
import com.example.spider.starter.SpiderStarter;
import com.example.spider.task.SpiderTaskQueue;
import lombok.Data;
import org.shoulder.core.util.JsonUtils;

import java.net.Proxy;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.List;
import java.util.Map;

/**
 * https://cool-proxy.net/ 【只有一页、6个，CN可能只有一两个，注意：2023.4 只支持https，不支持http】
 * https://cool-proxy.net/proxies.json 支持If-Modified-Since缓存校验返回304等
 * 【301限流？】
 *
 * @author lym
 */
//@Component
public class CoolProxyResultHandler extends AbstractProxyResultHandler implements SpiderStarter {

    public CoolProxyResultHandler() {
        super("coolProxy");
    }

    protected Duration defaultLimitRateDuration() {
        return Duration.ofSeconds(2);
    }

    @Override
    public void startSpiders() {
        IpProxySpiderTask task = createTask("https://cool-proxy.net/proxies.json");
        SpiderTaskQueue.putTask(task);
    }

    /**
     * 每 5 分钟触发一次
     */
    @Override
    public String executeCron() {
        return "0 */5 * * * ?";
    }

    @Override
    public void doHandle(IpProxySpiderTask task, String json) {

        List<CoolProxyDTO> list = JsonUtils.parseList(json, CoolProxyDTO.class);
        list.stream().map(CoolProxyDTO::toStandardModel).forEach(this::addProxyToSourceRepository);
    }

    /**
     * [{
     * "ip": "120.220.220.95",
     * "port": 8085,
     * "anonymous": 1,
     * "country_code": "CN",               // 地区
     * "country_name": "China", // "United Kingdom" "United States"
     * "update_time": 1649355949.0,
     * "working_average": 81.5995, // 成功率
     * "score": 170.588,           // 打分
     * "response_time_average": 3.31833,   // 平均响应时间
     * "download_speed_average": 42893.2   // 平均下载速度，估计 bytes/s
     * }]
     */
    @Data
    public static class CoolProxyDTO {

        private String ip;

        private Integer port;

        /**
         * 匿名类型 0 透明  1 匿名
         */
        private Integer anonymous;

        /**
         * China
         */
        private String country_name;

        /**
         * CN
         */
        private String country_code;

        /**
         * 时间戳
         * 1649355949.0
         */
        private double update_time;

        /**
         * 成功率
         */
        private double working_average;

        /**
         * 1分
         * 170-180 2分
         * 180-190 3分
         * 190-150 4分
         * 195+ 5分
         */
        private double score;
        /**
         * 响应时间
         */
        private double response_time_average;
        /**
         * 下载速度 kb/s
         */
        private double download_speed_average;


        public ProxyInfo toStandardModel() {
            return ProxyInfo.builder()
                    .source("coolProxy")
                    .ip(ip)
                    .port(port)
                    .anonymity(anonymous == 1 ? "匿名" : "透明")
                    .proxyTypeEnum(ProxyTypeEnum.HTTP)
                    .type(Proxy.Type.HTTP)
                    .location(country_code)
                    .responseTime((long) response_time_average)
                    .successPercentage((int) working_average)
                    .lastVerificationTime(LocalDateTime.ofInstant(Instant.ofEpochMilli((long) update_time), ZoneId.systemDefault()))
                    .extendInfo(Map.of(
                            "download_speed_average", String.valueOf(download_speed_average),
                            "cool_proxy_score", String.valueOf(score)
                    ))
                    .build();
        }

    }
}